//////////////////////////////////////////////////
// CMonitor - wrapper to Win32 multi-monitor API
//
// Author: Donald Kackman
// Email:  dkackman_2000@yahoo.com
// Copyright 2002, Donald Kackman
//
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
///////////////////////////////////////////////////

//
//David Campbell's article
//How to Exploit Multiple Monitor Support in Memphis and Windows NT 5.0
//is very helpful for multimonitor api calls
//http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0697/monitor/monitor.htm&nav=/msj/0697/newnav.htm
//
#pragma once

//include multimon.h here to get the types
//multimon.cpp includes this with the COMPILESTUBS define to get the implementations

//this is only necessary if the app is supporting win95
#if WINVER < 0x0500
#include "multimon.h"
#endif // WINVER < 0x0500

// CMonitor 

class CMonitor: public CObject
{
public:
	//construction destruction
	CMonitor();
	CMonitor(const CMonitor& monitor);
	virtual ~CMonitor();

	//operations
	void Attach(const HMONITOR hMonitor);
	HMONITOR Detach();

	void ClipRectToMonitor(LPRECT lprc, const BOOL UseWorkAreaRect = FALSE) const;
	void CenterRectToMonitor(LPRECT lprc, const BOOL UseWorkAreaRect = FALSE) const;
	void CenterWindowToMonitor(CWnd* const pWnd, const BOOL UseWorkAreaRect = FALSE) const;

	HDC CreateDC() const;

	//properties
	void GetMonitorRect(LPRECT lprc) const;
	void GetWorkAreaRect(LPRECT lprc) const;

	void GetName(CString& string) const;

	int GetBitsPerPixel() const;

	BOOL IsOnMonitor(const POINT pt) const;
	BOOL IsOnMonitor(const CWnd* pWnd) const;
	BOOL IsOnMonitor(const LPRECT lprc) const;

	BOOL IsPrimaryMonitor() const;
	BOOL IsMonitor() const;

	//operators
	operator HMONITOR() const
	{
		return this == NULL ? NULL : m_hMonitor;
	}

	BOOL operator ==(const CMonitor& monitor) const
	{
		return m_hMonitor == (HMONITOR) monitor;
	}

	BOOL operator !=(const CMonitor& monitor) const
	{
		return ! (*this == monitor);
	}

	void operator =(const CMonitor& monitor)
	{
		m_hMonitor = (HMONITOR) monitor;
	}

private:
	HMONITOR m_hMonitor;

};

